import Recorder from 'recorder-core';

import 'recorder-core/src/engine/wav';
import 'recorder-core/src/extensions/waveview';
import axios from 'axios';
// 使用模块化的全局变量
let rec = null;
let recBlob = null;
let ChatResult = null;



// 打开录音

function recOpen() {
    return new Promise((resolve, reject) => {
        // 创建录音对象
        rec = Recorder({
            type: 'wav',
            sampleRate: 16000,
            bitRate: 16,
        });

        if (!rec) {
            reject(new Error('当前浏览器不支持录音功能'));
            return;
        }

        // 请求麦克风权限
        rec.open(
            function () {
                console.log('麦克风权限已获取');
                resolve();
            },
            function (msg, isUserNotAllow) {
                const errorMsg = isUserNotAllow ? '用户拒绝了麦克风权限' : '无法访问麦克风: ' + msg;
                reject(new Error(errorMsg));
            }
        );
    });
}


// 开始录音
function recStart() {
    if (!rec) {
        const error = new Error('未打开录音');
        console.error(error);
        throw error;
    }
    rec.start();
    console.log('已开始录音');

}
// 结束录音
function recStop() {
    if (!rec) {
        console.error('未打开录音');
        return;
    }
    rec.stop(
        (blob, duration) => {
            //blob就是我们要的录音文件对象，可以上传，或者本地播放
            recBlob = blob;
            //简单利用URL生成本地文件地址，此地址只能本地使用，比如赋值给audio.src进行播放，赋值给a.href然后a.click()进行下载（a需提供download="xxx.mp3"属性）
            const localUrl = (window.URL || window.webkitURL).createObjectURL(blob);
            console.log('录音成功', blob, localUrl, '时长:' + duration + 'ms');
            upload(blob)
            // rec.close(); //关闭录音，释放录音资源，当然可以不释放，后面可以连续调用start
            // rec = null;
        },
        (err) => {
            console.error('结束录音出错：' + err);
            rec.close(); //关闭录音，释放录音资源，当然可以不释放，后面可以连续调用start
            rec = null;
        },
    );
}


// 上传录音
async function upload(blob) {
    if (!blob) {
        throw new Error('无效的录音文件');
    }

    try {
        const formData = new FormData();
        formData.append('vfile', blob, 'recording.wav');
        const voiceUrl = "http://127.0.0.1:5005/voiceapi"
        axios.post(voiceUrl, formData, {
            headers: { 'Content-Type': 'multipart/form-data' },
        }).then(res => {
            console.log('上传成功!');
            console.log(res.data);
            ChatResult = res.data
        })
    } catch (error) {
        console.error('上传失败:', error);
        throw error;
    }
}

// 本地播放录音
function recPlay() {
    if (!recBlob) {
        console.error('没有可播放的录音文件');
        return;
    }

    const localUrl = URL.createObjectURL(recBlob);
    const audio = new Audio(localUrl);
    audio.controls = true;
    document.body.appendChild(audio);
    audio.play();

    // 清理资源
    audio.onended = () => {
        URL.revokeObjectURL(localUrl);
        setTimeout(() => {
            document.body.removeChild(audio);
        }, 1000);
    };
}

export {
    recPlay,
    recStop,
    recOpen,
    recStart,
    ChatResult
};